package com.yzs.exam.utils;

import com.github.pagehelper.PageInfo;
import com.yzs.exam.entity.enums.ExamPaperTypeEnum;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 分页工具类：
 * 由于后台传到前台的数据一般不会是查询数据库直接得到的实体类，而是通过DTO类对数据进行二次封装后传递给前台，
 * 因此需要将pageInfo<>的泛型转换成相应的DTO类。
 * @author yzs
 * @create 2021-03-16 17:27
 */
public class PageInfoHelper {
    /**
     * <T, J>:方法类型参数
     * 有限制的通配符类型：? super T 消费者  -- ? extends J 生产者
     * 表示消费T生产J
     * @param source 页面对象
     * @param mapper 对应的DTO
     * @param <T>
     * @param <J>
     * @return
     */
    public static <T, J> PageInfo<J> copyMap(PageInfo<T> source, Function<? super T, ? extends J> mapper) {
        PageInfo<J> newPage = new PageInfo<>();
        newPage.setPageNum(source.getPageNum());
        newPage.setPageSize(source.getPageSize());
        newPage.setSize(source.getSize());
        newPage.setStartRow(source.getStartRow());
        newPage.setEndRow(source.getEndRow());
        newPage.setTotal(source.getTotal());
        newPage.setPages(source.getPages());
        //利用streamApi（对数据进行运算），获取顺序流 -- 接受一个函数（这里就调用了apply）并把流中每个元素收集 -- 到list
        newPage.setList(source.getList().stream().map(mapper).collect(Collectors.toList()));
        newPage.setPrePage(source.getPrePage());
        newPage.setNextPage(source.getNextPage());
        newPage.setIsFirstPage(source.isIsFirstPage());
        newPage.setIsLastPage(source.isIsLastPage());
        newPage.setHasPreviousPage(source.isHasPreviousPage());
        newPage.setHasNextPage(source.isHasNextPage());
        newPage.setNavigatePages(source.getNavigatePages());
        newPage.setNavigatepageNums(source.getNavigatepageNums());
        newPage.setNavigateFirstPage(source.getNavigateFirstPage());
        newPage.setNavigateLastPage(source.getNavigateLastPage());
        return newPage;
    }

}
